#include <iostream>
#include <vector>

using namespace std;

/*
    迭代器：广义指针，行为类似于指针的类对象，用来遍历访问容器中的元素
        迭代器可以解引用获取元素值
        迭代器分类：读写迭代器，只读迭代器，逆迭代器（反向迭代器）
            读写迭代器：可以访问容器元素，也可以修改容器元素
                    vector<int>::iterator it = v1.begin();和end()指向超尾位置
            只读迭代器：只能访问容器元素，不能修改容器元素
                    vector<int>::const_iterator it2 = v1.cbegin();和cend()指向超尾位置
            逆迭代器：指向容器的末尾元素，逆向遍历容器元素;可以访问容器元素，也可以修改容器元素
                    vector<int>::reverse_iterator it3 = v1.rbegin();和rend()指向超前位置
            只读逆迭代器：指向容器的末尾元素，逆向遍历容器元素;可以访问容器元素，不能修改容器元素
                    vector<int>::const_reverse_iterator it4 = v1.crbegin();和rend()指向超前位置
    传统的C语言数组也可以作为迭代器参数传递
*/

int main()
{
    // 创建vector对象存放int类型
    vector<int> v1;

    // push_back()尾插存放数据
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    // 定义迭代器对象，指向容器的起始位置
    vector<int>::iterator it = v1.begin();
    for (; it != v1.end(); it++)
    {
        *it += 3;
        cout << *it << endl;
    }
    cout << "--------------------------------" << endl;
    // 只读迭代器
    vector<int>::const_iterator it2 = v1.cbegin();
    for (; it2 != v1.cend(); it2++)
    {
        // *it2 += 3; //错误
        cout << *it2 << endl;
    }
    cout << "--------------------------------" << endl;
    // 逆向迭代器
    vector<int>::reverse_iterator it3 = v1.rbegin();
    for (; it3 != v1.rend(); it3++)
    {
        *it3 += 7;
        cout << *it3 << endl;
    }
    cout << "--------------------------------" << endl;
    // 只读逆向迭代器
    vector<int>::const_reverse_iterator it4 = v1.crbegin();
    for (; it4 != v1.crend(); it4++)
    {
        // *it4 += 7; //错误
        cout << *it4 << endl;
    }


    return 0;
}